/*
 * Created on 25-ago-2008
 *
 * TODO To change the template for this generated file go to
 * Window - Preferences - Java - Code Style - Code Templates
 */
package singletons;

import java.util.Calendar;
import java.util.GregorianCalendar;

/**
 * @author vpalomo
 *
 * TODO To change the template for this generated type comment go to
 * Window - Preferences - Java - Code Style - Code Templates
 */
public class CalendarioEventos {
    private static String codigoFuenteMesActual=null; //Contendr� el codigo fuente del calendaio del mes actual.
    private static String codigoFuenteMesSiguiente=null; //Contendr� el codigo fuente del calendaio del mes siguiente.
    private static long tiempoVida=30*60*1000; //Creo que esto son 30 minutos. Tiempo de vida maximo para los calendarios
    private static long expiraActual;  // limite de vida el String del codigo fuente del calendario del mes actual.
    private static long expiraSiguiente;  // limite de vida del String del codigo fuente del calendario del mes siguiente.
    
    public static long getExpira(){
        return expiraActual;
    }
    /**
     * Devuelve el calendario (codigo fuente para pintarlo) del mes de la fecha que pasemos. 
     * ESTILOS:
     * Los d�as se pintaran con los siguientes estilos:
     *      class diaPasadoSin: dias que ya han pasado y no tenian evento programado.
     *      class diaPasadoCon: dias pasados con evento programado.
     *      class diaActual: hoy, no se tiene en cuenta el dia de la fecha que pasamos, se har� con la fecha local (la del servidor).
     *      class diaFuturoSin: para los d�as que aun no han llegado y no tengan evento. De hoy en adelante.
     *      class diaFuturoCon: para los dias que aun no ha llegado y si tienen evento.
     * 
     * JAVASCRIPT:
     * Para todos los dias (tengan o no evento programado)
     * se crearan 2 funciones distintas, una en el evento onClick de la celda y otro en el onMouseOver
     * La funcion del onMouseOver:
     *      para dias pasados: sobreDiaPasado(fecha);   fecha: dd-mm-aaaa
     *      para dia actual:   sobreDiaActual(fecha);
     *      para dias futuros: sobreDiaFuturo(fecha);
     * La funcion del onClick:
     *      para dias pasados: accionDiaPasado(fecha);
     *      para dia actual:   accionDiaActual(fecha);
     *      para dia futuro:   accionDiaFuturo(fecha);
     * 
     * @param fecha (dd-mm-aaaa): dia para el que queremos que se pinte el calendario, si pasamo 22-01-1982 se pintar� el mes de Enero del 82, sin tener
     * en cuenta el dia 22. Como esta fecha es pasado se le aplicar� el estilo diaPasado a todos los d�as.
     * @return El codigo html necesario para poder crear el calendario del mes de la fecha pasado como parametro.
     */
    public static String getMes(String fecha) {
        int dia=Integer.parseInt(fecha.substring(0,2));
        int mes=Integer.parseInt(fecha.substring(3,5));
        int anio=Integer.parseInt(fecha.substring(6,10));
        Calendar fechaParametro=new GregorianCalendar(anio,mes-1,dia);
        Calendar fechaHoy=new GregorianCalendar();
        //String aux=hacerCalendario(fecha);
        
        if(fechaHoy.get(Calendar.MONTH)==fechaParametro.get(Calendar.MONTH)) {
            if(refrescarMesActual()) {
                codigoFuenteMesActual=hacerCalendario(fecha);
                expiraActual=System.currentTimeMillis()+tiempoVida;
            }
            return codigoFuenteMesActual;
        }
        Calendar fechaMesSiguiente=new GregorianCalendar(anio,mes,1); //Si al mes no le resto 1 ser� el mes siguiente. Cuidado con el dia porque podr�a ser el 31-01-2008 y al poner la fecha 31-02-2008 se cambiaria a 02-03-2008.
        if(fechaHoy.get(Calendar.MONTH)==fechaMesSiguiente.get(Calendar.MONTH)) {
            if(refrescarMesSiguiente()) {
                codigoFuenteMesSiguiente=hacerCalendario(fecha);
                expiraSiguiente=System.currentTimeMillis()+tiempoVida;
                
            }
            return codigoFuenteMesSiguiente;
        }else {
            return hacerCalendario(fecha);
        }
    }
    
    
    /**
     * Comprueba si es necesario actulizar el calendario del mes actual
     * @return
     */
    private static synchronized boolean refrescarMesActual() {
        if(expiraActual<System.currentTimeMillis() || codigoFuenteMesActual==null) {
            return true;
        }else {
            return false;
        }
    }
    /**
     * Comprueba si es necesario refrescar el calendario del mes siguiente.
     * @return
     */
    private static synchronized boolean refrescarMesSiguiente() {
        if(expiraSiguiente<System.currentTimeMillis() || codigoFuenteMesSiguiente==null) {
            return true;
        }else {
            return false;
        }
    }
    
    /**
     * Devuelve el calendario del mes siguiente a la fecha que pasemos, si pasamos la fecha 02-08-2008
     * nos devuelve el calendario de septiembre.
     * @param fecha String con la fecha del mes anterior al que queremos, en formato dd-mm-aaaa
     * @return El String con el codigo fuente para construir el calendario del mes siguiente. Los
     * estilos, javaescript, etc. son iguales que en getMes(String fecha)
     */
    public static String getMesSiguiente(String fecha) {
        int dia=Integer.parseInt(fecha.substring(0,2));
        int mes=Integer.parseInt(fecha.substring(3,5));
        int anio=Integer.parseInt(fecha.substring(6,10));
        
        
        Calendar fechaMesSiguiente=new GregorianCalendar(anio,mes,1); //Al cambiar de mes ponemos el dia 1 porque podr�a ser que el dia que nos han pasado sea el 31, lo que podr�a cambiar el mes siguiente
        return getMes(convierteFecha(fechaMesSiguiente));
       
    }
    
    
    /**
     * Crea el codigo fuente.
     * @param fecha La fecha es en formato dd-mm-aaaa, teniendo en cuenta que enero es el mes 1.
     * @return
     */
    private static String hacerCalendario(String fecha) {
        System.out.println("Construyendo");
        System.out.println("Construyendo");
        System.out.println("Construyendo");
        System.out.println("Construyendo");
        
        int dia=Integer.parseInt(fecha.substring(0,2));
        int mes=Integer.parseInt(fecha.substring(3,5));
        int anio=Integer.parseInt(fecha.substring(6,10));
        
        Calendar fechaParametro=new GregorianCalendar(anio,mes-1,dia);
        Calendar fechaHoy=new GregorianCalendar();
        
        String resul="";
        boolean tiene;
        //Hacemos la fecha del primer d�a del mes (de la fecha que nos han pasada)
        Calendar fechaAux=new GregorianCalendar(anio,mes-1,1);
        resul+="<table><tr><td colspan='7' class='estilomes'>"+nombreMes(mes)+"</td></tr><tr>";
       
        int primerDia=fechaAux.get(Calendar.DAY_OF_WEEK); //Primer dia del calendario (para el mes)
        tiene=ListaEventos.hayEvento(convierteFecha(fechaAux));
        switch (primerDia){
           case Calendar.MONDAY:
                          
               break;
           case Calendar.TUESDAY:
               resul+="<td></td>";
               break;
           case Calendar.WEDNESDAY:
               resul+="<td></td><td></td>";
           
               break;
           case Calendar.THURSDAY:
               resul+="<td></td><td></td><td></td>";
               break;
           case Calendar.FRIDAY:
               resul+="<td></td><td></td><td></td><td></td>";
               break;
           case Calendar.SATURDAY:
               resul+="<td></td><td></td><td></td><td></td><td></td>";
               break;
           case Calendar.SUNDAY:
               resul+="<td></td><td></td><td></td><td></td><td></td><td></td>";
               break;
        }
        
//#####################################################################################
        if(fechaAux.get(Calendar.DAY_OF_MONTH)==fechaHoy.get(Calendar.DAY_OF_MONTH) && fechaAux.get(Calendar.MONTH)==fechaHoy.get(Calendar.MONTH) && fechaAux.get(Calendar.YEAR)==fechaHoy.get(Calendar.YEAR)) {
            resul+="<td class='diaActual' onmouseout='cerrarCapa();return false;' onClick='accionDiaActual(\""+convierteFecha(fechaAux)+"\");return false;' onMouseOver='sobreDiaActual(\""+convierteFecha(fechaAux)+"\");'>  ";
        }else if(fechaAux.before(fechaHoy)) {  //Dias que ya han pasado
            if(tiene) {
                //resul+="<td class='diaPasadoCon' onMouseOver='funcion("+'"'+convierteFecha(fechaAux)+'"'+");'>  ";
                resul+="<td class='diaPasadoCon' onmouseout='cerrarCapa();return false;' onClick='accionDiaPasado(\""+convierteFecha(fechaAux)+"\");return false;' onMouseOver='sobreDiaPasado(\""+convierteFecha(fechaAux)+"\");'>  ";
            }else {
                resul+="<td class='diaPasadoSin' onmouseout='cerrarCapa();return false;' onClick='accionDiaPasado(\""+convierteFecha(fechaAux)+"\");return false;' onMouseOver='sobreDiaPasado(\""+convierteFecha(fechaAux)+"\");'>  ";
            }
            
        }else if(fechaAux.after(fechaHoy)){ // Dias futuros
            if(tiene) {
                resul+="<td class='diaFuturoCon' onmouseout='cerrarCapa();return false;' onClick='accionDiaFuturo(\""+convierteFecha(fechaAux)+"\");return false;' onMouseOver='sobreDiaFuturo(\""+convierteFecha(fechaAux)+"\");'>  ";
            }else {
                resul+="<td class='diaFuturoSin' onmouseout='cerrarCapa();return false;' onClick='accionDiaFuturo(\""+convierteFecha(fechaAux)+"\");return false;' onMouseOver='sobreDiaFuturo(\""+convierteFecha(fechaAux)+"\");'>  ";
            }
        }
        resul+=1+"</td>";
 //#######################################################################################
        
        
        int diaAux=2; //El dia 1 ya esta hecho
        int diaSemana;
        fechaAux=new GregorianCalendar(anio,mes-1,diaAux);
        
        //boolean tiene;
        while(fechaAux.get(Calendar.MONTH)==(mes-1) && diaAux<32) {
            tiene=ListaEventos.hayEvento(convierteFecha(fechaAux));
            diaSemana=fechaAux.get(Calendar.DAY_OF_WEEK);
            if(diaSemana==Calendar.MONDAY) {
                resul+="</tr><tr>";
            }
            if(fechaAux.get(Calendar.DAY_OF_MONTH)==fechaHoy.get(Calendar.DAY_OF_MONTH) && fechaAux.get(Calendar.MONTH)==fechaHoy.get(Calendar.MONTH) && fechaAux.get(Calendar.YEAR)==fechaHoy.get(Calendar.YEAR)) {
                resul+="<td class='diaActual' onmouseout='cerrarCapa();return false;' onClick='accionDiaActual(\""+convierteFecha(fechaAux)+"\");return false;' onMouseOver='sobreDiaActual(\""+convierteFecha(fechaAux)+"\");'>  ";
            }else if(fechaAux.before(fechaHoy)) {  //Dias que ya han pasado
                if(tiene) {
                    //resul+="<td class='diaPasadoCon' onMouseOver='funcion("+'"'+convierteFecha(fechaAux)+'"'+");'>  ";
                    resul+="<td class='diaPasadoCon' onmouseout='cerrarCapa();return false;' onClick='accionDiaPasado(\""+convierteFecha(fechaAux)+"\");return false;' onMouseOver='sobreDiaPasado(\""+convierteFecha(fechaAux)+"\");'>  ";
                }else {
                    resul+="<td class='diaPasadoSin' onmouseout='cerrarCapa();return false;' onClick='accionDiaPasado(\""+convierteFecha(fechaAux)+"\");return false;' onMouseOver='sobreDiaPasado(\""+convierteFecha(fechaAux)+"\");'>  ";
                }
                
            }else if(fechaAux.after(fechaHoy)){ // Dias futuros
                if(tiene) {
                    resul+="<td class='diaFuturoCon' onmouseout='cerrarCapa();return false;' onClick='accionDiaFuturo(\""+convierteFecha(fechaAux)+"\");return false;' onMouseOver='sobreDiaFuturo(\""+convierteFecha(fechaAux)+"\");'>  ";
                }else {
                    resul+="<td class='diaFuturoSin' onmouseout='cerrarCapa();return false;' onClick='accionDiaFuturo(\""+convierteFecha(fechaAux)+"\");return false;' onMouseOver='sobreDiaFuturo(\""+convierteFecha(fechaAux)+"\");'>  ";
                }
            }
            resul+=diaAux+"</td>";
            diaAux++;
            fechaAux=new GregorianCalendar(anio,mes-1,diaAux);
        }       
        resul+="</tr></table>";
        
        return resul;
    }
    
    /**
     * Convierte una fecha Calendar en un String dd-mm-aaaa. Recordar que al contruir el Calendar el mes empieza en 0
     * y en al fecha normal en 1 (enero=1).
     * @param c Fecha en formato Calendar
     * @return El String con la fecha en formato dd-mm-aaaa. Si el dia el es 2 devuelve 02
     */
    public static String convierteFecha(Calendar c) {
        String dia=""+((c.get(Calendar.DAY_OF_MONTH)<10)?("0"+c.get(Calendar.DAY_OF_MONTH)):""+c.get(Calendar.DAY_OF_MONTH));
        int mes=c.get(Calendar.MONTH)+1;
        String mesS=mes<10?"0"+mes:""+mes;
        String anio=""+c.get(Calendar.YEAR);
        return dia+"-"+mesS+"-"+anio;
    }
    public static String nombreMes(int mes){
        switch (mes){
            case 1:
                return "Enero";
            case 2:
                return "Febrero";
            case 3:
                return "Marzo";
            case 4:
                return "Abril";
            case 5:
                return "Mayo";
            case 6:
                return "Junio";
            case 7:
                return "Julio";
            case 8:
                return "Agosto";
            case 9:
                return "Septiembre";
            case 10:
                return "Octubre";
            case 11:
                return "Noviembre";
            case 12:
                return "Diciembre";
        }
        return "";
    }
}
